package com.base.control;

import android.content.Context;

import com.base.exception.CommonToastException;
import com.base.exception.ParamFormatException;
import com.base.util.Helper;
import com.base.util.MLog;

/**
 * Created by yjh on 15-3-10.
 */
public abstract class TaskWithExceptionHandler {
    private TaskHandlerConfig config = new TaskHandlerConfig();
    /**
     * 包含文本参数格式等自定义异常的业务代码
     */
    public abstract void onCheck() throws Exception;

    /**
     * 文本检查结果异常回调
     */
    public void onParamFormatException(){}

    /**
     * 其他异常回调
     */
    public void onException(Exception e){
        MLog.e(e);
    };

    public void onThrowable(Throwable e) {
        MLog.e(e);
    }

    /**
     * 设置参数
     * @param config
     * @return
     */
    public TaskWithExceptionHandler config(TaskHandlerConfig config) {
        this.config = config;
        return this;
    }

    /**
     * 开始在应用上下文中进行文本参数检查的处理
     * @param context
     */
    public boolean work(Context context) {
        boolean isError = true;
        try {
            onCheck();
            isError = false; //执行到此，没有异常发生
        } catch(ParamFormatException e) {
            onParamFormatException();
            if(config.isParamFormation())
                Helper.toast(context, e.getMessage());
        } catch(CommonToastException e) {
            Helper.toast(context, e.getMessage());
        } catch(Exception e) {
            onException(e);
            Helper.toast(context, e);
        } catch (Throwable t) {
            onThrowable(t);
            Helper.toast(context, context.getClass().getName() + " " + t);
        }

        return isError;
    }


    /**
     * 包含是否用toast显示异常信息的各种配置信息
     * 默认配置：
     * ParamFormatException 文本参数信息检查 true 抛出toast提示
     */
    public static class TaskHandlerConfig {
        //文本参数错误默认用toast抛出
        private boolean isParamFormation = true;

        public boolean isParamFormation() {
            return isParamFormation;
        }

        public TaskHandlerConfig setParamFormation(boolean isParamFormation) {
            this.isParamFormation = isParamFormation;
            return this;
        }
    }
}
